<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Process;

class InstallAppCommand extends Command
{
    protected $signature = 'install-app
        {--init : 初始化系统}
        {--migrate : 迁移数据库}
        {--seed : 填充数据库}
        {--format : 格式化代码}
    ';

    protected $description = '安装系统';

    /**
     * Execute the console command.
     */
    public function handle(): void
    {
        // 初始化系统
        if ($this->option('init')) {
            $this->init();
        }

        // 迁移数据库
        if ($this->option('migrate')) {
            $this->call('migrate');
        }

        // 填充数据库
        if ($this->option('seed')) {
            $this->seed();
        }

        // 格式化代码
        if ($this->option('format')) {
           $this->pint();
        }
    }

    public function init(): void
    {
        // 创建key
        $this->call('key:generate');

        // 目录权限
        $this->call('storage:link');

        // bootstrap/cache 设置权限 775
        chmod(base_path('bootstrap/cache'), 0775);
        $this->info('bootstrap/cache 设置权限 775');

        // storage 设置权限 775
        chmod(base_path('storage'), 0775);
        $this->info('storage 设置权限 775');

    }

    public function seed(): void
    {
        if (! $this->confirm('是否开始初始化系统数据？', true)) {
            $this->info('系统数据初始化取消');
            return;
        }

        // 执行数据填充
        $this->call('db:seed', ['--class' => 'WebSiteConfigTableSeeder', '--force' => true]);
        $this->info('网站设置数据填充完成');

        // 执行数据填充
        $this->call('db:seed', ['--class' => 'SystemConfigTableSeeder', '--force' => true]);
        $this->info('系统设置数据填充完成');

        // 执行数据填充
        $this->call('db:seed', ['--class' => 'AdminTableSeeder', '--force' => true]);
        $this->info('管理员数据填充完成');
    }

    public function pint(): void
    {
        $pintPath = base_path('vendor/bin/pint');

        // 在 Windows 上，使用完整的 PHP 命令来运行 pint
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            $command = PHP_BINARY." \"$pintPath\"";
        } else {
            $command = "\"$pintPath\"";
        }

        $result = Process::path(base_path())->run($command);

        if (! $result->successful()) {
            $this->error($result->errorOutput());
        }

        $this->info('代码格式化完成');
    }
}
